package com.nowcoder.topic.dfs.middle;

/**
 * NC138 矩阵最长递增路径
 * @author d3y1
 */
public class NC138{
    private int ROW;
    private int COL;
    private int[] dx = new int[]{0, 1, 0, -1};
    private int[] dy = new int[]{1, 0, -1, 0};

    private int result = 0;
    private int[][] dp;

    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 递增路径的最大长度
     * @param matrix int整型二维数组 描述矩阵的每个数
     * @return int整型
     */
    public int solve (int[][] matrix) {
        return solution(matrix);
    }

    /**
     * 模拟法: 递归 && 动态规划
     * @param matrix
     * @return
     */
    private int solution(int[][] matrix){
        ROW = matrix.length;
        COL = matrix[0].length;

        dp = new int[ROW][COL];

        for(int i=0; i<ROW; i++){
            for(int j=0; j<COL; j++){
                result = Math.max(result, dfs(matrix, i, j));
            }
        }

        return result;
    }

    /**
     * dfs
     * @param matrix
     * @param x
     * @param y
     */
    private int dfs(int[][] matrix, int x, int y){
        if(dp[x][y] > 0){
            return dp[x][y];
        }

        dp[x][y]++;

        for(int i=0; i<4; i++){
            int nextX = x+dx[i];
            int nextY = y+dy[i];
            if(isValid(nextX, nextY) && matrix[x][y]<matrix[nextX][nextY]){
                dp[x][y] = Math.max(dp[x][y], dfs(matrix, nextX, nextY)+1);
            }
        }

        return dp[x][y];
    }

    /**
     * 是否合法(是否越界)
     * @param x
     * @param y
     * @return
     */
    private boolean isValid(int x, int y){
        if(x<0 || x>=ROW || y<0 || y>=COL){
            return false;
        }

        return true;
    }
}